Ruby断点续传下载

当下载大文件时,如果网络不稳定或者程序异常退出,会导致下载失败,甚至重试多次仍无法完成下载。为此,OSS提供了断点续传下载功能。断点续传下载将需要下载的文件分成若干个分片分别下载,所有分片都下载完成后,将所有分片合并成完整的文件。

实现方法

您可以通过Bucket#resumable_download方法来实现断点续传下载。该方法包含以下参数:

参数

描述

是否必选

默认值

key

OSS文件完整路径。

说明

如果待下载的文件ETag值发生变化,会导致下载失败。

file

下载到本地文件的完整路径。

:cpt_file

指定用于记录断点信息的文件,您需要对该文件有写入权限。

说明
  • 下载过程的进度信息记录在.cpt文件中。已下载的分片将保存为file.part.N。如果下载过程中某一分片下载失败,再次下载时会从.cpt文件中记录的断点继续下载。再次调用Bucket#resumable_download时需指定与上次相同的.cpt文件。文件下载完成后,part文件和.cpt文件均被删除。

  • .cpt文件不仅记录了下载的中间状态信息,还附带校验功能。.cpt文件不允许编辑。如果.cpt文件损坏,则无法继续下载。

本地文件同目录下的file.cpt,其中file表示本地文件名称

:disable_cpt

下载过程中是否记录下载进度。取值如下:

  • true:下载过程中不记录下载进度,失败后无法进行续传。

  • false:下载过程中记录下载进度,失败后从断点记录处进行续传。

false

:part_size

指定每个分片的大小。

10 MB

&block

调用时传递了block,则下载进度会交由block处理。

更多说明,请参见API文档

示例代码

以下代码用于断点续传下载。

require 'aliyun/oss'

client = Aliyun::OSS::Client.new(
  # Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
  endpoint: 'https://oss-cn-hangzhou.aliyuncs.com',
  # 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
  access_key_id: ENV['OSS_ACCESS_KEY_ID'],
  access_key_secret: ENV['OSS_ACCESS_KEY_SECRET']
)

# 填写Bucket名称,例如examplebucket。
bucket = client.get_bucket('examplebucket')
# key填写Object完整路径,Object完整路径中不能包含Bucket名称,例如exampledir/example.zip。
# file填写本地文件的完整路径,例如/tmp/example.zip。
bucket.resumable_download('exampledir/example.zip', '/tmp/example.zip') do |p|
  puts "Progress: #{p}"
end

bucket.resumable_download(
  'exampledir/example.zip', '/tmp/example.zip',
  # cpt_file填写用于记录断点信息的文件路径。
  :part_size => 100 * 1024, :cpt_file => '/tmp/example.zip.cpt') { |p|
  puts "Progress: #{p}"
}

相关文档

关于断点续传下载的API接口说明,请参见GetObject